import { login, userInfo, userProfile } from '@/api/user'
import { setToken, getToken, removeToken, setTimeStamp, getTimeStamp } from '@/utils/auth'
import { resetRouter } from '@/router'

const state = {
  // 保存token
  token: getToken(),
  // 声明一个保存用户信息的state
  userInfo: {}
}

const mutations = {

  // 设置token
  setToken(state, token) {
    // 存到vuex的state
    state.token = token
    // 存到本地
    setToken(token)
    // 保存的token时立即保存时间戳
    setTimeStamp()
  },

  // 设置用户信息
  setUserInfo(state, payload) {

    state.userInfo = payload
  },


  // 删除token
  removeToken(state) {
    state.token = null
    // 删除本地的
    removeToken()
  },

  // 用户信息
  removeUserInfo(state) {

    state.userInfo = {}
  }
}

const actions = {

  // 发请求获取token
  async login(context, data) {

    // 传入参数
    try {

      let res = await login(data)
      context.commit('setToken', res.data)

    } catch (error) {

      // 来到这证明请求失败，让代码报错
      // 这样子Login.vue就能收到失败的信息了
      return Promise.reject(error)
    }
  },

  // 发请求获取用户信息
  async getUserInfo(context) {

    // 发请求
    let res = await userInfo()
    // 发请求获取基本资料
    let res2 = await userProfile(res.data.userId)

    // 请问此时userInfo里应该res和res2里的数据都要有
    let allInfo = {
      ...(res.data),
      ...(res2.data)
    }
    context.commit('setUserInfo', allInfo)

    // 把用户信息返回出去
    return allInfo
  },

  // 做退出
  logout({ commit, dispatch }) {
    
    // 删除token
    commit('removeToken')
    // 删除用户信息
    commit('removeUserInfo')
    // 没有重置路由表，如果有了权限控制一定要重置路由表
    // 不重置就会导致上一个账号登录得到的路由表，下个账号还有
    resetRouter()
    // 清空页签
    // 如何调用别的vuex模块里的actions？
    // 代表这个action调用的不是本模块里的，而是调用根模块里的
    dispatch('tagsView/delAllViews', null, { root: true } )
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

